package com.shfl.task.listener;

import cn.hutool.core.date.DateUtil;
import com.shfl.task.logic.bean.TaskLog;
import com.shfl.task.logic.constants.CommonConstants;
import com.shfl.task.logic.service.TaskLogService;
import org.quartz.JobExecutionContext;
import org.quartz.Trigger;
import org.quartz.TriggerListener;

/**
 * 触发器监听器
 */
public class MyTriggerListener implements TriggerListener {

    private TaskLogService taskLogService;

    public MyTriggerListener(TaskLogService taskLogService) {
        this.taskLogService = taskLogService;
    }

    //获取该监听器的名称
    @Override
    public String getName() {
        return this.getClass().getSimpleName();
    }

    /**
     * 当与监听器相关联的Trigger被触发，Job上的execute()方法将被执行时，Scheduler就调用该方法
     * 被执行前触发
     *
     * @param trigger
     * @param jobExecutionContext
     */
    @Override
    public void triggerFired(Trigger trigger, JobExecutionContext jobExecutionContext) {
    }

    /**
     * 在 Trigger 触发后，Job 将要被执行时由 Scheduler 调用这个方法。
     * TriggerListener 给了一个选择去否决 Job 的执行。
     * 假如这个方法返回 true，这个 Job 将不会为此次 Trigger 触发而得到执行。
     * 未被执行时触发
     *
     * @param trigger
     * @param jobExecutionContext
     * @return
     */
    @Override
    public boolean vetoJobExecution(Trigger trigger, JobExecutionContext jobExecutionContext) {
//        TaskLog taskLog = new TaskLog();
//        taskLog.setTaskId(Long.valueOf(trigger.getKey().getName()));
//        taskLog.setLastTime(trigger.getNextFireTime().getTime());
//        taskLog.setTaskStatus(CommonConstants.TaskLogStatus.VETO_JOB.getCode());
//        saveLog(taskLog);
        return false;
    }

    /**
     * Scheduler 调用这个方法是在 Trigger 错过触发时。
     * 你应该关注此方法中持续时间长的逻辑：在出现许多错过触发的 Trigger 时，
     * 长逻辑会导致骨牌效应。你应当保持这上方法尽量的小。
     * 错过执行时触发
     *
     * @param trigger
     */
    @Override
    public void triggerMisfired(Trigger trigger) {
        TaskLog taskLog = new TaskLog();
        taskLog.setTaskId(Long.valueOf(trigger.getKey().getName()));
        taskLog.setLastTime(trigger.getNextFireTime().getTime());
        taskLog.setTaskStatus(CommonConstants.TaskLogStatus.MISS.getCode());
        saveLog(taskLog);
    }

    /**
     * rigger 被触发并且完成了 Job 的执行时，Scheduler 调用这个方法
     * 完成时触发
     *
     * @param trigger
     * @param jobExecutionContext
     * @param completedExecutionInstruction
     */
    @Override
    public void triggerComplete(Trigger trigger, JobExecutionContext jobExecutionContext, Trigger.CompletedExecutionInstruction completedExecutionInstruction) {
        TaskLog taskLog = new TaskLog();
        taskLog.setTaskId(Long.valueOf(trigger.getKey().getName()));
        taskLog.setLastTime(trigger.getNextFireTime().getTime());
        taskLog.setTaskStatus(CommonConstants.TaskLogStatus.SUCCESS.getCode());
        saveLog(taskLog);
    }

    private void saveLog(TaskLog taskLog) {

        taskLog.setCreateTime(DateUtil.current());
        taskLogService.insertSelective(taskLog);
    }
}
